package rwmutex

import "sync"

// RWMutex 是带有用于并发安全功能的开关的sync.RWMutex。
// 如果其属性sync.RWMutex不为nil，则表示它处于并发安全使用中。
// 它的属性sync.RWMutex默认为nil，这使此结构糊状轻量。
type RWMutex struct {
	*sync.RWMutex
}

// New 创建并返回一个新的 *RWMutex。参数<safe>用于指定是否在并发安全中使用此互斥锁，默认情况下为false。
func New(safe ...bool) *RWMutex {
	mu := Create(safe...)
	return &mu
}

// Create 创建并返回一个新的 RWMutex 对象。参数<safe>用于指定是否在并发安全中使用此互斥锁，默认情况下为false。
func Create(safe ...bool) RWMutex {
	mu := RWMutex{}
	if len(safe) > 0 && safe[0] {
		mu.RWMutex = new(sync.RWMutex)
	}
	return mu
}

// IsSafe 检查并返回当前互斥对象是否处于并发安全使用状态。
func (mu *RWMutex) IsSafe() bool {
	return mu.RWMutex != nil
}

// Lock 锁定互斥锁以进行写入，如果没有并发安全使用，则不执行任何操作。
func (mu *RWMutex) Lock() {
	if mu.RWMutex != nil {
		mu.RWMutex.Lock()
	}
}

// Unlock 解锁互斥锁进行写入。如果不是在并发安全使用中，它什么也不做。
func (mu *RWMutex) Unlock() {
	if mu.RWMutex != nil {
		mu.RWMutex.Unlock()
	}
}

// RLock 锁定互斥锁以进行读取。如果不是在并发安全使用中，它什么也不做。
func (mu *RWMutex) RLock() {
	if mu.RWMutex != nil {
		mu.RWMutex.RLock()
	}
}

// RUnlock 解锁互斥锁以进行读取。如果不是在并发安全使用中，它什么也不做。
func (mu *RWMutex) RUnlock() {
	if mu.RWMutex != nil {
		mu.RWMutex.RUnlock()
	}
}
